import gradio as gr
from serviceboot.serviceboot import serviceboot_client, gen_api_docs


class PythonFrontend(object):

    # 在__init__中定义Python前端界面
    def __init__(self):
        model_name_cn = '摘要生成-PALM2.0-base'
        model_name_en = 'text-generation-abstract-palm-base'
        # ============================固定代码块 BEGIN==================================================================
        url_model_zoo = 'https://openi.pcl.ac.cn/cubeai-model-zoo/cubeai-model-zoo'
        url_model = f'https://openi.pcl.ac.cn/cubeai-model-zoo/{model_name_en}'
        title = f'CubeAI应用示范——{model_name_cn}'
        description = f'源自 [CubeAI模型示范库]({url_model_zoo}) 项目： [{model_name_cn}]({url_model})'
        with gr.Blocks(title=title) as self.demo:
            gr.Markdown('<br/>')
            gr.Markdown(f'# <center>{title}</center>')
            gr.Markdown('<br/>')
            gr.Markdown(description)
            # ============================固定代码块 END================================================================

            with gr.Row():
                with gr.Column(scale=1):
                    text = gr.Textbox(label='原文')
                with gr.Column(scale=1):
                    result = gr.Textbox(label='摘要')
            btn_predict = gr.Button(value='生成摘要')
            btn_predict.click(self.predict, inputs=[text], outputs=[result])
            text.submit(self.predict, inputs=[text], outputs=[result])

            example1 = '昨天起，上海地铁3号线长江南路站、殷高西路站、江湾镇站三站进一步限流。体验发现，高峰时段排队5分钟能进站；不少乘客选择提前起床，“现在提前10到20分钟起床，即便限流也不会影响上班”。被限流的XDJMS，你们提前多久？新民网'
            example2 = '本文总结了十个可穿戴产品的设计原则，而这些原则，同样也是笔者认为是这个行业最吸引人的地方：1.为人们解决重复性问题；2.从人开始，而不是从机器开始；3.要引起注意，但不要刻意；4.提升用户能力，而不是取代'
            gr.Examples(label='示例', examples=[example1, example2], inputs=[text])

            gr.Markdown('<br/>')
            api_text = gen_api_docs(self.predict)
            # ============================固定代码块 BEGIN===============================================================
            btn_show_api = gr.Button(value='显示API文档')
            btn_hide_api = gr.Button(value='隐藏API文档', visible=False)
            api_docs = gr.Markdown(api_text, visible=False)
            btn_show_api.click(lambda: (btn_show_api.update(visible=False), btn_hide_api.update(visible=True), api_docs.update(visible=True)),
                               outputs=[btn_show_api, btn_hide_api, api_docs])
            btn_hide_api.click(lambda: (btn_show_api.update(visible=True), btn_hide_api.update(visible=False), api_docs.update(visible=False)),
                               outputs=[btn_show_api, btn_hide_api, api_docs])
            gr.Markdown('<br/>')
            gr.Markdown(open('README.md').read())
            # ============================固定代码块 END=================================================================

    # 在launch方法中启动Python前端服务，必须存在
    def launch(self, **kwargs):
        self.demo.launch(**kwargs)

    def predict(self, text):
        result = serviceboot_client('predict', text=text)
        return result['value']
